码出高效

throw throws

throw是方法内部抛出具体异常类对象的关键字,throws则用在方法上,表示方法调用者可以通过此方法声明向上抛出异常对象。

异常分类

在Exception中,unchecked异常是运行时异常,它们都继承自RuntimeException,不需要程序进行显式的捕捉和处理。

try代码块

(1)try代码块:监视代码执行过程,一旦发现异常直接跳转catch,没有catch。则直接跳转至finally。
(2)catch代码块
(3)finally代码块:try存在时,可以只有catch代码块,也可以只有finally代码块。不管有没有异常发生,即使发生OutOfMemoryError也会执行,通常用于处理善后清理工作。

finally是在return表达式运行后执行的,此时将要return的结果已经被暂存起来,待finally代码块执行结束后再将之暂存的结果返回。

finally代码块中使用return语句使返回值的判断变得复杂,所以避免返回值不可控,不要在finally代码块中使用return语句。

Lock、ThreadLocal、InputStream等这些需要进行强制释放和清除的对象都得在finally代码块中进行显式的清理,避免产生内存泄露,或者资源消耗。

java核心技术36讲

业界有一种争论,甚至可以算是某种程度的共识,Java语言的Cheaked Exception也许是一个设计错误
(1)Checked Exception的假设是捕获了异常然后恢复程序。但是实际上大多数情况下根本不可能恢复。Checked Exception的使用已经大大偏离了最初的设计目的。
(2)Checked Exception不兼容functional编程。

但是确实有意向异常,比如和环境相关的IO、网络等其实是存在可恢复性的。

从性能角度看Java异常处理机制,有两个比较昂贵的地方:
(1)try-catch代码段会产生额外的性能开销,它往往会影响JVM对代码进行优化,所以建议仅捕获必要的代码段,不要一个大的try包住整段代码;与此同时用异常控制代码流程远比通常意义上的条件语句要低效。
(2)Java每实例化一个Exception,都会对当时的栈进行快照,这是一个相对比较重的操作。如果发生的比较频繁,这个开销就不能忽略了。